#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //child
        int cnt = 5;
        while(cnt)
        {
            printf("Child is running, pid: %d, ppid: %d\n",getpid(), getppid());
            sleep(1);
            cnt--;
        }
        exit(1);//这里设置进程退出码为1，方便于看到下面的status参数存放 退出码 是存在哪个位置的
        //因为子进程退出码设置为1，则存在次次低8位，故而下面打印出来，status=256 00000000000000 00000001 00000000 = 256
    }
    
    int status = 0;  //status是一个输出型参数
    /* 
     status是一个32为整形的输出型参数，用于存放1、退出码 2、退出信号 
     其中只有后面的低16位是我们经常用到的。0000 0000 0000 0000 （0000 0000）（左边8位是存放的进程退出码） 0000 0000（最低的8位存放的是退出信号）    
    */
    pid_t rid = waitpid(id, &status, 0); //阻塞等待   id这个参数 ==-1时则waitpid与wait函数无差异，即等待回收任意一个子进程
    //当 id > 0 时，等待指定的id进程
    if(rid > 0)
    {
        printf("wait success, rid: %d, status: %d\n", rid, status);
    }







    //father
    //printf("父进程休眠\n");
    //sleep(10);
    //printf("父进程开始回收了\n");

    //pid_t rid = wait(NULL); //阻塞等待
    //if(rid > 0)
    //{
    //    printf("wait success, rid: %d\n",rid);
    //}
    //printf("父进程回收僵尸成功\n");
    //sleep(3);

    return 0;
}














